/* 
 * File:   TabelaHash.cpp
 * Author: Pedro
 * 
 * Created on 17 de Agosto de 2010, 08:50
 */

#include "../Classe/TabelaHash.h"
#include "../NoCelula.h"
///instancia as linhas da tabela
TabelaHash::TabelaHash()
{        
    for(int i = 0; i < NUMHASH; i++)
    {
        this->Celulas[i] = new Lista();
    }
}

//retorna o codigo
int TabelaHash::Cod(string lexema)
{
    int retorno = 0;

    for(int i = 0; i < lexema.length();i++){

        retorno += lexema[i];
    }

    if (retorno < 0)
        retorno = retorno * -1;

    return retorno;
}

//reorna o hash
int TabelaHash::Hash(string lexema){
    return TabelaHash::Cod(lexema)%NUMHASH;
}
//insere na tabela
void TabelaHash::Insere(NoCelula celula)
{
    int pos = this->Hash(celula.lexema);
    (*this->Celulas[pos]) << celula;
}
//sobrecarrega o operador << pra inserção
void TabelaHash::operator <<(NoCelula celula){
    this->Insere(celula);
}
//sobrecarrega o operador >> pra remoção
void TabelaHash::operator >>(NoCelula celula)
{
    this->Remove(celula);
}

//procura na tabela pelo lexema
Campo* TabelaHash::procurarPor(string lexema)
{
    Campo *retorno = NULL;
    int pos = this->Hash(lexema);

    if(this->Celulas[pos]->existeNaLista(lexema)){
        retorno = new Campo();
       *retorno = this->Celulas[pos]->procuraPor(lexema);
    }
    return retorno;
}
//verifica se existe na tabela
bool TabelaHash::existeNaTabela(string lexema)
{
    return (this->procurarPor(lexema)!=NULL);
}
void TabelaHash::Remove(NoCelula celula)
{
    int pos = this->Hash(celula.lexema);
    (*this->Celulas[pos]) >> celula;
}

TabelaHash::TabelaHash(const TabelaHash& orig) {
}

//mostra a tabela
void TabelaHash::ExibeTabela(){

    for(int i = 0; i < NUMHASH; i++)
    {
    cout << "Linha " << i << " : ->";
        if(this->Celulas[i]!=NULL)
            this->Celulas[i]->ExibeLista();

    cout << "\n------------------------------------------------\n";
    }

}
TabelaHash::~TabelaHash() {
}

